﻿
#include "Engine/common.h"
#include "DNF定义.h"
#include "DNF对象定义.h"
#include "strid.h"
#include "设置模块.h"
#include "AppUI.h"

int 获取装备对象索引(int 部位,int 装备区索引);	//UI装备区.cpp
int 获取护石对应技能索引(int 技能区索引);	//UI技能区.cpp
int 获取符文对应技能索引(int 技能区索引);	//UI技能区.cpp

void 构建武器对象()
{
	int 装备区索引=GetIndexSetting(设置_武器);
	int 装备对象索引=获取装备对象索引(武器,装备区索引);
	DNF武器对象* 武器对象=当前角色对象->武器动态对象;
	if (装备区索引==0)
	{
		武器对象->空装备=TRUE;
		武器对象->武器系列=(DNF武器系列)-1;
		武器对象->装备索引=装备对象索引;
		武器对象->武器类型=武器_未知;
		武器对象->雾神武器=FALSE;
		武器对象->攻强成长倍率=1.0f;
	}
	else
	{
		float 攻强成长倍率_固定武器=攻强成长神40/攻强成长标80;
		float 攻强成长倍率_领域之主武器=攻强成长标70/攻强成长神60;
		float 攻强成长倍率_雾神武器=1.0f;
		武器对象->空装备=FALSE;
		装备区索引-=1;
		int 武器系列=装备区索引%14;
		int 武器类型=装备区索引/14+1;	//0对应[武器_未知]
		if (武器系列>=焰_浴火之厄武器系列 && 武器系列<=跨越之忆武器系列)	//雾神武器升级会影响品质
		{
			int 星团等级=GetIndexSetting(设置_武器星团等级)+1;
			int 记忆等级=GetIndexSetting(设置_武器记忆等级);
			if (星团等级<20 && 记忆等级<6)
				武器对象->品质=史诗;
			else if (星团等级==20 && 记忆等级<6)
				武器对象->品质=史诗Plus;
			else if (星团等级<20 && 记忆等级==6)
				武器对象->品质=太初Lite;
			else if (星团等级==20 && 记忆等级==6)
				武器对象->品质=太初;
			武器对象->雾神武器=TRUE;
			武器对象->攻强成长倍率=1.0f;
			if (武器系列==失衡_崩离边界武器系列)	//等价于CP升神40
				武器对象->攻强成长倍率=攻强成长倍率_固定武器;
			else if (武器系列==跨越之忆武器系列)	//等价于领域之主标70
				武器对象->攻强成长倍率=攻强成长倍率_领域之主武器;
		}
		else if (武器系列==领域之主武器系列)
		{
			武器对象->品质=传说;
			武器对象->雾神武器=FALSE;
			武器对象->攻强成长倍率=攻强成长倍率_领域之主武器;
		}
		else
		{
			武器对象->品质=史诗;
			武器对象->雾神武器=FALSE;
			武器对象->攻强成长倍率=攻强成长倍率_固定武器;
		}
		武器对象->武器系列=(DNF武器系列)武器系列;
		if (当前职业对象->职业==职业_光明骑士女)
			武器对象->武器类型=(DNF武器类型)武器类型;
		else if (当前职业对象->职业==职业_流浪武士)
			武器对象->武器类型=(DNF武器类型)(武器类型+5);
		武器对象->装备索引=装备对象索引;	//图标，描述等可能会用到
	}
}

void 设置武器贴膜(int 装备区索引)
{
	if (装备区索引==0)
	{
		//无武器时，武器贴膜仍可用，和其他贴膜一致起来
		//只有不选武器贴膜，或选了雾神武器，武器贴膜才失效
		当前角色对象->使用武器贴膜=FALSE;
		return ;
	}
	else
	{
		int 武器装备区索引=GetIndexSetting(设置_武器);
		int 武器系列=武器装备区索引%14;
		if (武器系列>=焰_浴火之厄武器系列 && 武器系列<=跨越之忆武器系列)
			当前角色对象->使用武器贴膜=FALSE;
		else
			当前角色对象->使用武器贴膜=TRUE;	//只有选择了武器贴膜，且没选雾神武器，才会应用武器贴膜
	}
}

int 贴膜对象映射表[12][96]=
{
	//上衣
	{
		1, 2, 3, 4, 5, 6, 7, 8, 
		9, 10, 11, 12, 13, 14, 15, 16, 
		17, 18, 19, 20, 21, 22, 23, 24, 
		25, 26, 27, 28, 29, 30, 31, 32, 
		33, 34, 35, 36, 37, 38, 39, 40, 
		41, 42, 43, 44, 45, 46, 47, 48, 
		49, 50, 51, 52, 53, 54, 55, 56, 
		57, 58, 59, 60, 61, 62, 63, 64, 
		65, 66, 67, 68, 69, 70, 71, 72, 
		73, 74, 75, 76, 77, 78, 79, 80, 
		81, 82, 83, 84, 85, 86, 87, 88, 
		89, 90, 91, 92, 93, 94, 95, 96, 
	},
	//下装
	{
		97, 98, 99, 100, 101, 102, 103, 104, 
		105, 106, 107, 108, 109, 110, 111, 112, 
		113, 114, 115, 116, 117, 118, 119, 120, 
		121, 122, 123, 124, 125, 126, 31, 32, 
		33, 34, 35, 36, 37, 38, 39, 40, 
		41, 42, 43, 44, 45, 46, 47, 48, 
		49, 50, 51, 52, 53, 54, 55, 56, 
		57, 58, 59, 60, 61, 62, 63, 64, 
		65, 66, 67, 68, 69, 70, 71, 72, 
		73, 74, 75, 76, 77, 78, 79, 80, 
		81, 82, 83, 84, 85, 86, 87, 88, 
		89, 90, 91, 92, 93, 94, 127, 128, 
	},
	//护肩
		{
		129, 130, 131, 132, 133, 134, 135, 136, 
			137, 138, 139, 140, 141, 142, 143, 144, 
			145, 146, 147, 148, 149, 150, 151, 152, 
			153, 154, 155, 156, 157, 158, 31, 32, 
			33, 34, 35, 36, 37, 38, 39, 40, 
			41, 42, 43, 44, 45, 46, 47, 48, 
			49, 50, 51, 52, 53, 54, 55, 56, 
			57, 58, 59, 60, 61, 62, 63, 64, 
			65, 66, 67, 68, 69, 70, 71, 72, 
			73, 74, 75, 76, 77, 78, 79, 80, 
			81, 82, 83, 84, 85, 86, 87, 88, 
			89, 90, 91, 92, 93, 94, 159, 160, 
		},
		//腰带
		{
			161, 162, 163, 164, 165, 166, 167, 168, 
				169, 170, 171, 172, 173, 174, 175, 176, 
				177, 178, 179, 180, 181, 182, 183, 184, 
				185, 186, 187, 188, 189, 190, 31, 32, 
				33, 34, 35, 36, 37, 38, 39, 40, 
				41, 42, 43, 44, 45, 46, 47, 48, 
				49, 50, 51, 52, 53, 54, 55, 56, 
				57, 58, 59, 60, 61, 62, 63, 64, 
				65, 66, 67, 68, 69, 70, 71, 72, 
				73, 74, 75, 76, 77, 78, 79, 80, 
				81, 82, 83, 84, 85, 86, 87, 88, 
				89, 90, 91, 92, 93, 94, 191, 192, 
		},
		//鞋子
		{
			193, 194, 195, 196, 197, 198, 199, 200, 
				201, 202, 203, 204, 205, 206, 207, 208, 
				209, 210, 211, 212, 213, 214, 215, 216, 
				217, 218, 219, 220, 221, 222, 31, 32, 
				33, 34, 35, 36, 37, 38, 39, 40, 
				41, 42, 43, 44, 45, 46, 47, 48, 
				49, 50, 51, 52, 53, 54, 55, 56, 
				57, 58, 59, 60, 61, 62, 63, 64, 
				65, 66, 67, 68, 69, 70, 71, 72, 
				73, 74, 75, 76, 77, 78, 79, 80, 
				81, 82, 83, 84, 85, 86, 87, 88, 
				89, 90, 91, 92, 93, 94, 223, 224, 
		},
		//手镯
		{
			225, 226, 227, 228, 229, 230, 231, 232, 
				233, 234, 235, 236, 237, 238, 239, 240, 
				241, 242, 243, 244, 245, 246, 247, 248, 
				249, 250, 251, 252, 253, 254, 255, 256, 
				257, 258, 259, 260, 261, 262, 263, 264, 
				265, 266, 267, 268, 269, 270, 271, 272, 
				273, 274, 275, 276, 277, 278, 279, 280, 
				281, 282, 283, 284, 285, 286, 287, 65, 
				66, 67, 68, 69, 70, 71, 72, 73, 
				74, 75, 76, 77, 78, 79, 80, 81, 
				82, 83, 84, 288, 85, 86, 87, 89, 
				88, 90, 91, 289, 290, 291, 292, 293, 
		},
		//项链
		{
			294, 295, 296, 297, 298, 299, 300, 301, 
				302, 303, 304, 305, 306, 307, 308, 309, 
				310, 311, 312, 313, 314, 315, 316, 317, 
				318, 319, 320, 321, 322, 323, 255, 256, 
				257, 258, 259, 260, 261, 262, 263, 264, 
				265, 266, 267, 268, 269, 270, 271, 272, 
				273, 274, 275, 276, 277, 278, 279, 280, 
				281, 282, 283, 284, 285, 286, 287, 65, 
				66, 67, 68, 69, 70, 71, 72, 73, 
				74, 75, 76, 77, 78, 79, 80, 81, 
				82, 83, 84, 288, 85, 86, 87, 89, 
				88, 90, 91, 289, 290, 291, 324, 325, 
		},
		//戒指
		{
			326, 327, 328, 329, 330, 331, 332, 333, 
				334, 335, 336, 337, 338, 339, 340, 341, 
				342, 343, 344, 345, 346, 347, 348, 349, 
				350, 351, 352, 353, 354, 355, 255, 256, 
				257, 258, 259, 260, 261, 262, 263, 264, 
				265, 266, 267, 268, 269, 270, 271, 272, 
				273, 274, 275, 276, 277, 278, 279, 280, 
				281, 282, 283, 284, 285, 286, 287, 65, 
				66, 67, 68, 69, 70, 71, 72, 73, 
				74, 75, 76, 77, 78, 79, 80, 81, 
				82, 83, 84, 288, 85, 86, 87, 89, 
				88, 90, 91, 289, 290, 291, 356, 357, 
		},
		//左槽
		{
			358, 359, 360, 361, 362, 363, 364, 365, 
				366, 367, 368, 369, 370, 371, 372, 373, 
				374, 375, 376, 377, 378, 379, 380, 381, 
				382, 383, 384, 385, 386, 387, 388, 389, 
				390, 391, 392, 393, 394, 395, 396, 397, 
				398, 399, 400, 401, 402, 403, 404, 405, 
				406, 407, 408, 409, 410, 411, 412, 413, 
				414, 415, 416, 417, 418, 419, 420, 421, 
				65, 66, 67, 68, 69, 70, 71, 72, 
				73, 74, 75, 76, 77, 78, 79, 80, 
				81, 82, 83, 84, 85, 86, 87, 89, 
				88, 90, 91, 422, 423, 424, 425, 426, 
		},
		//右槽
		{
			427, 428, 429, 430, 431, 432, 433, 434, 
				435, 436, 437, 438, 439, 440, 441, 442, 
				443, 444, 445, 446, 447, 448, 449, 450, 
				451, 452, 453, 454, 455, 456, 388, 389, 
				390, 391, 392, 393, 394, 395, 396, 397, 
				398, 399, 400, 401, 402, 403, 404, 405, 
				406, 407, 408, 409, 410, 411, 412, 413, 
				414, 415, 416, 417, 418, 419, 420, 421, 
				65, 66, 67, 68, 69, 70, 71, 72, 
				73, 74, 75, 76, 77, 78, 79, 80, 
				81, 82, 83, 84, 85, 86, 87, 89, 
				88, 90, 91, 422, 423, 424, 457, 458, 
		},
		//耳环
		{
			459, 460, 461, 462, 463, 464, 465, 466, 
				467, 468, 469, 470, 471, 472, 473, 474, 
				475, 476, 477, 478, 479, 480, 481, 482, 
				483, 484, 485, 486, 487, 488, 388, 389, 
				390, 391, 392, 393, 394, 395, 396, 397, 
				398, 399, 400, 401, 402, 403, 404, 405, 
				406, 407, 408, 409, 410, 411, 412, 413, 
				414, 415, 416, 417, 418, 419, 420, 421, 
				65, 66, 67, 68, 69, 70, 71, 72, 
				73, 74, 75, 76, 77, 78, 79, 80, 
				81, 82, 83, 84, 85, 86, 87, 89, 
				88, 90, 91, 422, 423, 424, 489, 490, 
		},
		//武器
		{
			65, 66, 67, 68, 69, 70, 71, 72, 
			73, 74, 75, 76, 77, 78, 79, 80, 
			81, 82, 83, 84, 85, 86, 87, 89, 
			88, 90, 91, 39, 40, 41, 42, 43, 
			44, 45, 46, 47, 48, 51, 49, 50, 
			53, 277, 278, 279, 280, 281, 282, 283, 
			284, 285, 422, 423, 424, 388, 389, 390, 
			391, 392, 393, 394, 395, 396, 397, 398, 
			399, 400, 401, 402, 403, 404, 405, 406, 
			1, 129, 130, 161, 162, 193, 459, 105, 
			106, 137, 138, 167, 465, 175, 176, 207, 
			208, 22, 117, 118, 376, 445, 446, 477, 
		}
};

//目前共515个不重复的自定义对象，此数字不含索引0处的空对象
//再后面是80个武器贴膜对象和80个武器贴膜龙焰对象，最后是44个传说贴膜对象
const int 自定义词条对象总数=490;

void 设置收集箱属性()
{
	int 类型=GetIndexSetting(设置_收集箱类型);
	int 稀有数量=GetIndexSetting(设置_收集箱稀有数量);
	int 神器数量=GetIndexSetting(设置_收集箱神器数量);
	if (类型==0)	//无
	{
		当前角色对象->收集箱三攻=0;
		当前角色对象->收集箱属强=0;
		当前角色对象->收集箱四维=0;
	}
	else if (类型==1)	//2023春节套
	{
		当前角色对象->收集箱三攻=10*稀有数量;
		当前角色对象->收集箱属强=2*神器数量;
		当前角色对象->收集箱四维=10*神器数量;
	}
	else if (类型==2)	//2023夏日套
	{
		当前角色对象->收集箱三攻=5*稀有数量;
		当前角色对象->收集箱属强=1*神器数量;
		当前角色对象->收集箱四维=5*神器数量;
	}
	else if (类型==3)	//2024春节套
	{
		当前角色对象->收集箱三攻=15*稀有数量;
		当前角色对象->收集箱属强=3*神器数量;
		当前角色对象->收集箱四维=15*神器数量;
	}
	else if (类型==4)	//2024夏日套
	{
		当前角色对象->收集箱三攻=10*稀有数量;
		当前角色对象->收集箱属强=2*神器数量;
		当前角色对象->收集箱四维=10*神器数量;
	}
}



void UpdateSettingToCalcModule()
{
	for (int SettingIndex=0;SettingIndex<DNF设置项总数;SettingIndex++)
	{
		if (GetSettingChangeState(SettingIndex)==0)
			continue;
		int Index=GetIndexSetting(SettingIndex);
		float Value=GetValueSettingRaw(SettingIndex);
		if (SettingIndex>=设置_上衣 && SettingIndex<=设置_宠物)
		{
			int 部位=SettingIndex-设置_上衣;
			if (部位==武器)
			{
				构建武器对象();
			}
			else
			{
				int 装备对象索引=获取装备对象索引(部位,Index);
				当前角色对象->角色装备[部位]=(装备对象表[装备类])[装备对象索引];
				//如果选择了自定义装备，将其对应的词条对象应用于计算模块
				if (SettingIndex<=设置_耳环 && Index>=32)
				{
					int 系列=Index-32;
					for (int i=0;i<4;i++)
					{
						DNF装备对象* 词条对象=(装备对象表[词条类])[0];
						int 词条索引=GetIndexSetting(设置_恩特系列上衣词条1+系列*44+部位*4+i);
						if (Index!=-1)
						{
							int 词条对象索引=贴膜对象映射表[部位][词条索引];
							词条对象=(装备对象表[词条类])[词条对象索引];
						}
						if (i==0)
							当前角色对象->角色装备词条1[部位]=词条对象;
						else if (i==1)
							当前角色对象->角色装备词条2[部位]=词条对象;
						else if (i==2)
							当前角色对象->角色装备词条3[部位]=词条对象;
						else if (i==3)
							当前角色对象->角色装备词条4[部位]=词条对象;	
					}
				}
			}
		}
		else if (SettingIndex>=设置_上衣贴膜 && SettingIndex<=设置_武器贴膜)
		{
			//武器贴膜只需要实现光杖和光剑，其余以NULL占位；无武器时也可以有贴膜，但是不会用
			int 部位=SettingIndex-设置_上衣;
			if (部位==武器贴膜)
			{
				设置武器贴膜(Index);
			}
			else
			{
				int 装备对象索引=获取装备对象索引(部位,Index);
				当前角色对象->角色装备[部位]=(装备对象表[装备类])[装备对象索引];
			}
		}
		else if (SettingIndex>=设置_上衣强化类型 && SettingIndex<=设置_武器强化类型)
		{
			int 部位=SettingIndex-设置_上衣强化类型;
			当前角色对象->装备强化类型[部位]=Index;
		}
		else if (SettingIndex>=设置_上衣强化等级 && SettingIndex<=设置_武器强化等级)
		{
			int 部位=SettingIndex-设置_上衣强化等级;
			当前角色对象->装备强化等级[部位]=Index;
		}
		else if (SettingIndex==设置_武器锻造等级)
		{
			当前角色对象->武器锻造等级=Index;
		}
		else if (SettingIndex>=设置_上衣附魔 && SettingIndex<=设置_宠物附魔)
		{
			int 部位=SettingIndex-设置_上衣附魔;
			//Index是打造区索引，按部位分的，必须还原成对象索引
			//由于使用名字加入UI，这里直接用UI对应的文本查找对象
			WCHAR* 附魔名称=GetCurrSelText(SettingIndex);
			std::map<WCHAR*,DNF装备对象*,wstrless_t>::iterator it=((装备对象表_名称[附魔类]).find(附魔名称));
			if (it!=(装备对象表_名称[附魔类]).end())
				当前角色对象->角色附魔[部位]=it->second;
		}
		else if (SettingIndex>=设置_上衣徽章1 && SettingIndex<=设置_戒指徽章1)
		{
			int 部位=SettingIndex-设置_上衣徽章1;
			//Index是打造区索引，按部位分的，必须还原成对象索引
			//由于使用名字加入UI，这里直接用UI对应的文本查找对象
			WCHAR* 徽章名称=GetCurrSelText(SettingIndex);
			std::map<WCHAR*,DNF装备对象*,wstrless_t>::iterator it=((装备对象表_名称[徽章类]).find(徽章名称));
			if (it!=(装备对象表_名称[徽章类]).end())
				当前角色对象->角色徽章1[部位]=it->second;
		}
		else if (SettingIndex==设置_左槽徽章1 || SettingIndex==设置_右槽徽章1)
		{
			int 部位=SettingIndex-设置_上衣徽章1;
			//Index是打造区索引，按部位分的，必须还原成对象索引
			//由于使用名字加入UI，这里直接用UI对应的文本查找对象
			//白金徽章的名字特殊，加入时使用职业技能名，而创建的对象名有前缀"白金徽章-"（无徽章和闪耀徽章除外）
			WCHAR* 徽章名称=GetCurrSelText(SettingIndex);
			WCHAR 徽章完整名称[100];
			if (Index>=2)
				swprintf(徽章完整名称,L"白金徽章-%s",徽章名称);
			else
				wcscpy(徽章完整名称,徽章名称);
			std::map<WCHAR*,DNF装备对象*,wstrless_t>::iterator it=((装备对象表_名称[徽章类]).find(徽章完整名称));
			if (it!=(装备对象表_名称[徽章类]).end())
				当前角色对象->角色徽章1[部位]=it->second;
		}
		else if (SettingIndex>=设置_上衣徽章2 && SettingIndex<=设置_戒指徽章2)
		{
			int 部位=SettingIndex-设置_上衣徽章2;
			//Index是打造区索引，按部位分的，必须还原成对象索引
			//由于使用名字加入UI，这里直接用UI对应的文本查找对象
			WCHAR* 徽章名称=GetCurrSelText(SettingIndex);
			std::map<WCHAR*,DNF装备对象*,wstrless_t>::iterator it=((装备对象表_名称[徽章类]).find(徽章名称));
			if (it!=(装备对象表_名称[徽章类]).end())
				当前角色对象->角色徽章2[部位]=it->second;
		}
		else if (SettingIndex>=设置_恩特系列上衣词条1 && SettingIndex<=设置_武器词条4)
		{
			int 部位=武器;
			int 序号=SettingIndex-设置_武器词条1;
			BOOL 影响计算=TRUE;
			if (SettingIndex>=设置_恩特系列上衣词条1 && SettingIndex<=设置_领域系列耳环词条4)
			{
				部位=(SettingIndex-设置_恩特系列上衣词条1)%(11*4)/4;
				序号=(SettingIndex-设置_恩特系列上衣词条1)%(11*4)%4;
				//只有当设置的目标系列影响到当前装备时，才需要更新计算模块的对象
				//武器共用同一套设置，词条变更肯定会影响，每次都切换词条对象
				int 设置系列=(SettingIndex-设置_恩特系列上衣词条1)/(11*4);
				int 当前系列=GetIndexSetting(设置_上衣+部位)-32;	//不是自定义则小于0，验证不等于即可
				if (设置系列!=当前系列)
					影响计算=FALSE;
			}
			if (影响计算)
			{
				DNF装备对象* 词条对象=(装备对象表[词条类])[0];	//空词条在索引0
				if (Index!=-1)
				{
					//仅实现不重复的词条对象，提供映射表寻找对象
					//对于同一部位，UI传过来的Index都是有效的，可以用于查表
					//同时UI负责了过滤词条的专属部位，使得传递过来的都是合理选择
					//映射表已经考虑到索引0是空对象，无需额外调整
					int 词条对象索引=贴膜对象映射表[部位][Index];
					词条对象=(装备对象表[词条类])[词条对象索引];		
				}
				if (序号==0)
					当前角色对象->角色装备词条1[部位]=词条对象;
				else if (序号==1)
					当前角色对象->角色装备词条2[部位]=词条对象;
				else if (序号==2)
					当前角色对象->角色装备词条3[部位]=词条对象;
				else if (序号==3)
					当前角色对象->角色装备词条4[部位]=词条对象;	
			}
		}
		else if (SettingIndex>=设置_武器融合词条1 && SettingIndex<=设置_武器融合词条3)
		{
			int 序号=SettingIndex-设置_武器融合词条1;
			DNF装备对象* 词条对象=(装备对象表[词条类])[0];
			if (Index!=-1)
			{
				//空词条*1，普通词条x个，武器龙焰词条*80，传说词条*44
				if (SettingIndex!=设置_武器融合词条3)
				{
					int 词条对象索引=1+自定义词条对象总数+Index;
					词条对象=(装备对象表[词条类])[词条对象索引];
				}
				else
				{
					int 词条对象索引=1+自定义词条对象总数+80+Index;
					词条对象=(装备对象表[词条类])[词条对象索引];
				}
			}
			当前角色对象->武器融合词条[序号]=词条对象;
		}
		else if (SettingIndex>=设置_左槽融合词条1 && SettingIndex<=设置_耳环融合词条3)
		{
			int 部位=(SettingIndex-设置_左槽融合词条1)/3;
			int 序号=(SettingIndex-设置_左槽融合词条1)%3;
			DNF装备对象* 词条对象=(装备对象表[词条类])[0];
			if (Index!=-1)
			{
				//空词条*1，普通词条x个，武器龙焰词条*80，传说词条*44
				int 词条对象索引=1+自定义词条对象总数+80*2+Index;	//3个部位都一样
				词条对象=(装备对象表[词条类])[词条对象索引];	
			}
			当前角色对象->传说融合词条[部位*3+序号]=词条对象;
		}
		else if (SettingIndex>=设置_手镯融合升级 && SettingIndex<=设置_耳环融合升级)
		{
			int 部位=SettingIndex-设置_手镯融合升级;
			当前角色对象->贴膜升级[部位]=Index;
		}
		else if (SettingIndex==设置_武器星团等级)
		{
			当前角色对象->武器星团等级=Index+1;	//UI的星团从1级开始
			构建武器对象();	//星团20影响武器品质
		}
		else if (SettingIndex==设置_武器梦境等级)
		{
			当前角色对象->武器梦境等级=Index;
		}
		else if (SettingIndex==设置_武器记忆等级)
		{
			当前角色对象->武器记忆等级=Index;
			构建武器对象();	//记忆6影响武器品质
		}
		else if (SettingIndex>=设置_装扮头部品质 && SettingIndex<=设置_装扮鞋子品质)
		{
			DNF装扮对象* 装扮对象=当前角色对象->装扮动态对象;
			int 部位=SettingIndex-设置_装扮头部品质;
			int Index2=-1;	//上衣技能单独处理
			if (部位!=装扮上衣)
				Index2=GetIndexSetting(设置_装扮头部属性+部位);
			装扮对象->设置装扮参数((DNF装扮部位)部位,Index,Index2);
		}
		else if (SettingIndex>=设置_装扮头部属性 && SettingIndex<=设置_装扮鞋子属性)
		{
			DNF装扮对象* 装扮对象=当前角色对象->装扮动态对象;
			int 部位=SettingIndex-设置_装扮头部属性;
			if (部位==装扮上衣)
			{
				WCHAR* 技能名称=GetCurrSelText(SettingIndex);
				装扮对象->设置上衣技能(技能名称);
			}
			else
			{
				int Index2=GetIndexSetting(设置_装扮头部品质+部位);
				装扮对象->设置装扮参数((DNF装扮部位)部位,Index2,Index);
			}
		}
		else if (SettingIndex==设置_武器装扮)
		{
			//武器装扮单独存放，索引从0开始
			当前角色对象->武器装扮=(装备对象表[武器装扮类])[Index];
		}
		else if (SettingIndex==设置_皮肤)
		{
			//皮肤单独存放，索引从0开始
			当前角色对象->皮肤=(装备对象表[皮肤类])[Index];
		}
		else if (SettingIndex==设置_光环)
		{
			//光环单独存放，索引从0开始
			当前角色对象->光环=(装备对象表[光环类])[Index];
		}
		else if (SettingIndex==设置_武器装扮徽章1 || SettingIndex==设置_武器装扮徽章2)
		{
			int 序号=SettingIndex-设置_武器装扮徽章1;	
			WCHAR* 徽章名称=GetCurrSelText(SettingIndex);
			std::map<WCHAR*,DNF装备对象*,wstrless_t>::iterator it=((装备对象表_名称[徽章类]).find(徽章名称));
			if (it!=(装备对象表_名称[徽章类]).end())
				当前角色对象->武器装扮徽章[序号]=it->second;
		}
		else if (SettingIndex==设置_皮肤徽章1 || SettingIndex==设置_皮肤徽章2)
		{
			int 序号=SettingIndex-设置_皮肤徽章1;
			WCHAR* 徽章名称=GetCurrSelText(SettingIndex);
			std::map<WCHAR*,DNF装备对象*,wstrless_t>::iterator it=((装备对象表_名称[徽章类]).find(徽章名称));
			if (it!=(装备对象表_名称[徽章类]).end())
				当前角色对象->皮肤徽章[序号]=it->second;
		}
		else if (SettingIndex==设置_光环徽章1 || SettingIndex==设置_光环徽章2)
		{
			int 序号=SettingIndex-设置_光环徽章1;
			WCHAR* 徽章名称=GetCurrSelText(SettingIndex);
			std::map<WCHAR*,DNF装备对象*,wstrless_t>::iterator it=((装备对象表_名称[徽章类]).find(徽章名称));
			if (it!=(装备对象表_名称[徽章类]).end())
				当前角色对象->光环徽章[序号]=it->second;
		}
		else if (SettingIndex>=设置_辟邪玉词条1 && SettingIndex<=设置_辟邪玉词条4)
		{
			DNF辟邪玉对象* 辟邪玉对象=当前角色对象->辟邪玉动态对象;
			int 序号=SettingIndex-设置_辟邪玉词条1;
			float Value2=GetValueSettingRaw(设置_辟邪玉词条1属性+序号);
			辟邪玉对象->设置辟邪玉参数(序号,Index,Value2);
		}
		else if (SettingIndex>=设置_辟邪玉词条1属性 && SettingIndex<=设置_辟邪玉词条4属性)
		{
			DNF辟邪玉对象* 辟邪玉对象=当前角色对象->辟邪玉动态对象;
			int 序号=SettingIndex-设置_辟邪玉词条1属性;
			int Index2=GetIndexSetting(设置_辟邪玉词条1+序号);
			辟邪玉对象->设置辟邪玉参数(序号,Index2,Value);
		}
		else if (SettingIndex==设置_星辰百变数量)
		{
			当前角色对象->星辰百变数量=Index;
		}
		else if (SettingIndex==设置_跨越之忆星团)
		{
			当前角色对象->跨越之忆星团=Index+焰_浴火之厄武器系列;
		}
		else if (SettingIndex==设置_副武器状态)
		{
			当前角色对象->副武器状态=Index;
		}
		else if (SettingIndex==设置_副武器强化)
		{
			当前角色对象->副武器强化=Index;
		}
		else if (SettingIndex==设置_红色宠物装备)
		{
			WCHAR* 名称=GetCurrSelText(SettingIndex);
			std::map<WCHAR*,DNF装备对象*,wstrless_t>::iterator it=((装备对象表_名称[宠物装备类]).find(名称));
			if (it!=(装备对象表_名称[宠物装备类]).end())
				当前角色对象->红色宠物装备=it->second;
		}
		else if (SettingIndex==设置_蓝色宠物装备)
		{
			WCHAR* 名称=GetCurrSelText(SettingIndex);
			std::map<WCHAR*,DNF装备对象*,wstrless_t>::iterator it=((装备对象表_名称[宠物装备类]).find(名称));
			if (it!=(装备对象表_名称[宠物装备类]).end())
				当前角色对象->蓝色宠物装备=it->second;
		}
		else if (SettingIndex==设置_绿色宠物装备)
		{
			WCHAR* 名称=GetCurrSelText(SettingIndex);
			std::map<WCHAR*,DNF装备对象*,wstrless_t>::iterator it=((装备对象表_名称[宠物装备类]).find(名称));
			if (it!=(装备对象表_名称[宠物装备类]).end())
				当前角色对象->绿色宠物装备=it->second;
		}
		else if (SettingIndex==设置_快捷栏装备)
		{
			//快捷栏装备单独存放，索引从0开始
			当前角色对象->快捷栏装备=(装备对象表[快捷栏装备类])[Index];
		}
		else if (SettingIndex==设置_勋章品质)
		{
			当前角色对象->勋章品质=(DNF品质)Index;
		}
		else if (SettingIndex==设置_勋章强化)
		{
			当前角色对象->勋章强化=(DNF品质)Index;
		}
		else if (SettingIndex>=设置_守护珠1品质 && SettingIndex<=设置_守护珠4品质)
		{
			int 序号=SettingIndex-设置_守护珠1品质;
			当前角色对象->守护珠品质[序号]=(DNF品质)Index;
		}
		else if (SettingIndex==设置_冒险团等级)
		{
			当前角色对象->冒险团等级=Index+1;	//没有0级
		}
		else if (SettingIndex==设置_公会属性)
		{
			if (Index==0)
				当前角色对象->公会属性四维=0;
			else if (Index==1)
				当前角色对象->公会属性四维=60;
			else if (Index==2)
				当前角色对象->公会属性四维=120;
		}
		else if (SettingIndex==设置_公会训练官属性1)
		{
			if (Index==0)
			{
				当前角色对象->公会训练官四维=0;
				当前角色对象->公会训练官三攻=0;
			}
			else if (Index==1)
			{
				当前角色对象->公会训练官四维=40;
				当前角色对象->公会训练官三攻=25;
			}
			else if (Index==2)
			{
				当前角色对象->公会训练官四维=50;
				当前角色对象->公会训练官三攻=30;
			}
			else if (Index==3)
			{
				当前角色对象->公会训练官四维=60;
				当前角色对象->公会训练官三攻=35;
			}
			else if (Index==4)
			{
				当前角色对象->公会训练官四维=80;
				当前角色对象->公会训练官三攻=50;
			}
		}
		else if (SettingIndex==设置_公会训练官属性2)
		{
			if (Index==0)
				当前角色对象->公会训练官三速=0;
			else if (Index==1)
				当前角色对象->公会训练官三速=PC(1);
			else if (Index==2)
				当前角色对象->公会训练官三速=PC(2);
			else if (Index==3)
				当前角色对象->公会训练官三速=PC(3);
			else if (Index==4)
				当前角色对象->公会训练官三速=PC(4);
		}
		else if (SettingIndex==设置_婚房属性)
		{
			if (Index==0)
			{
				当前角色对象->结婚属强=0;
				当前角色对象->结婚物攻=0;
				当前角色对象->结婚魔攻=0;
				当前角色对象->结婚独立=0;
			}
			else if (Index==1)
			{
				当前角色对象->结婚属强=1;
				当前角色对象->结婚物攻=0;
				当前角色对象->结婚魔攻=0;
				当前角色对象->结婚独立=0;
			}
			else if (Index==2)
			{
				当前角色对象->结婚属强=3;
				当前角色对象->结婚物攻=0;
				当前角色对象->结婚魔攻=0;
				当前角色对象->结婚独立=0;
			}
			else if (Index==3)
			{
				当前角色对象->结婚属强=5;
				当前角色对象->结婚物攻=5;
				当前角色对象->结婚魔攻=5;
				当前角色对象->结婚独立=5;
			}
			else if (Index==4)
			{
				当前角色对象->结婚属强=8;
				当前角色对象->结婚物攻=10;
				当前角色对象->结婚魔攻=10;
				当前角色对象->结婚独立=20;
			}
		}
		else if (SettingIndex==设置_婚戒属性)
		{
			if (Index==0)
			{
				当前角色对象->结婚力智=0;
				当前角色对象->结婚攻速=PC(0);
				当前角色对象->结婚施放=PC(0);
				当前角色对象->结婚移速=PC(0);
			}
			else if (Index==1)
			{
				当前角色对象->结婚力智=0;
				当前角色对象->结婚攻速=PC(0);
				当前角色对象->结婚施放=PC(0);
				当前角色对象->结婚移速=PC(0);
			}
			else if (Index==2)
			{
				当前角色对象->结婚力智=15;
				当前角色对象->结婚攻速=PC(0);
				当前角色对象->结婚施放=PC(0);
				当前角色对象->结婚移速=PC(0);
			}
			else if (Index==3)
			{
				当前角色对象->结婚力智=15;
				当前角色对象->结婚攻速=PC(0);
				当前角色对象->结婚施放=PC(0);
				当前角色对象->结婚移速=PC(2);
			}
			else if (Index==4)
			{
				当前角色对象->结婚力智=15;
				当前角色对象->结婚攻速=PC(2);
				当前角色对象->结婚施放=PC(2);
				当前角色对象->结婚移速=PC(2);
			}
		}
		else if (SettingIndex==设置_晶体契约)
		{
			if (Index==0)
				当前角色对象->晶体契约三攻=0;
			else if (Index==1)
				当前角色对象->晶体契约三攻=40;
		}
		else if (SettingIndex==设置_名称装饰卡)
		{
			if (Index==0)
			{
				当前角色对象->名称装饰卡四维=0;
				当前角色对象->名称装饰卡三速=0;
			}
			else if (Index==1)
			{
				当前角色对象->名称装饰卡四维=3;
				当前角色对象->名称装饰卡三速=PC(1);
			}
		}
		else if (SettingIndex>=设置_收集箱类型 && SettingIndex<=设置_收集箱神器数量)
		{
			设置收集箱属性();
		}
		else if (SettingIndex>=设置_辅助力智加成 && SettingIndex<=设置_技攻补正)
		{
			float v1=GetValueSettingRaw(设置_辅助力智加成);
			float v2=GetValueSettingRaw(设置_辅助三攻加成);
			float v3=GetValueSettingRaw(设置_辅助技攻加成);
			if (!fequal(v1,0) && !fequal(v2,0))
				当前角色对象->适用辅助补正=TRUE;
			else
				当前角色对象->适用辅助补正=FALSE;
			float v4=GetValueSettingRaw(设置_四维补正);
			float v5=GetValueSettingRaw(设置_三攻补正);
			float v6=GetValueSettingRaw(设置_技攻补正);
			//合并辅助属性
			当前角色对象->四维补正=v1+v4;
			当前角色对象->三攻补正=v2+v5;
			当前角色对象->技攻补正=(1.0f+v3)*(1.0f+v6)-1.0f;
		}
		else if (SettingIndex==设置_攻击强化补正)
		{
			//补正项其实可以限制下范围
			当前角色对象->攻击强化补正=Value;
		}
		else if (SettingIndex==设置_攻击强化增幅补正)
		{
			当前角色对象->攻击强化增幅补正=Value;
		}
		else if (SettingIndex>=设置_火强补正 && SettingIndex<=设置_暗强补正)
		{
			int 索引=SettingIndex-设置_火强补正;
			当前角色对象->属强补正[索引]=Value;
		}
		else if (SettingIndex>=设置_火抗补正 && SettingIndex<=设置_暗抗补正)
		{
			int 索引=SettingIndex-设置_火抗补正;
			当前角色对象->属抗补正[索引]=Value;
		}
		else if (SettingIndex>=设置_异常状态1补正 && SettingIndex<=设置_异常状态13补正)
		{
			int 索引=SettingIndex-设置_异常状态1补正;
			当前角色对象->异抗补正[索引]=Value;
		}
		else if (SettingIndex==设置_攻速补正)
		{
			当前角色对象->攻速补正=Value;
		}
		else if (SettingIndex==设置_技能范围补正)
		{
			当前角色对象->技能范围补正=Value;
		}
		else if (SettingIndex==设置_MP消耗量补正)
		{
			当前角色对象->MP消耗量补正=Value;
		}
		else if (SettingIndex==设置_特性类型)
		{
			当前角色对象->特性类型=Index;
		}
		else if (SettingIndex>=设置_特性1等级 && SettingIndex<=设置_特性14等级)
		{
			int 索引=SettingIndex-设置_特性1等级;
			当前角色对象->特性等级[索引]=Index;
		}
		else if (SettingIndex>=设置_主动技能1等级 && SettingIndex<=设置_主动技能20等级)
		{
			int 索引=SettingIndex-设置_主动技能1等级;
			当前角色对象->技能等级[索引]=Index;
		}
		else if (SettingIndex>=设置_主动技能1TP等级 && SettingIndex<=设置_主动技能20TP等级)
		{
			int 索引=SettingIndex-设置_主动技能1TP等级;
			当前角色对象->技能TP等级[索引]=Index;
		}
		else if (SettingIndex>=设置_主动技能1次数 && SettingIndex<=设置_主动技能20手搓次数)
		{
			int 索引=SettingIndex-设置_主动技能1手搓次数;
			if (SettingIndex<=设置_主动技能20次数)
				索引=SettingIndex-设置_主动技能1次数;
			else if (SettingIndex<=设置_主动技能20宠物次数)
				索引=SettingIndex-设置_主动技能1宠物次数;
			int 次数=(int)GetValueSettingRaw(设置_主动技能1次数+索引);
			int 宠物次数=(int)GetValueSettingRaw(设置_主动技能1宠物次数+索引);
			int 手搓次数=(int)GetValueSettingRaw(设置_主动技能1手搓次数+索引);
			if (宠物次数>次数)
				宠物次数=次数;
			if (手搓次数>次数)
				手搓次数=次数;
			当前角色对象->技能次数[索引]=次数;
			当前角色对象->技能受宠物加成次数[索引]=宠物次数;
			当前角色对象->技能受手搓加成次数[索引]=手搓次数;
		}
		else if (SettingIndex>=设置_主动技能1手搓方向键数量 && SettingIndex<=设置_主动技能20手搓方向键数量)
		{
			int 索引=SettingIndex-设置_主动技能1手搓方向键数量;
			当前角色对象->技能手搓方向键数量[索引]=Index;
		}
		else if (SettingIndex>=设置_主动技能1在快捷栏 && SettingIndex<=设置_主动技能20在快捷栏)
		{
			int 索引=SettingIndex-设置_主动技能1在快捷栏;
			当前角色对象->技能在快捷栏里[索引]=Index;
			int 空位=14;
			for (int i=0;i<当前职业对象->主动技能数量;i++)
			{
				BOOL x=GetIndexSetting(设置_主动技能1在快捷栏+i);
				if (x) 空位--;
			}
			if (空位<0) 空位=0;
			当前角色对象->技能快捷栏空位=空位;
		}
		else if (SettingIndex>=设置_被动技能1等级 && SettingIndex<=设置_被动技能10等级)
		{
			int 索引=SettingIndex-设置_被动技能1等级;
			当前角色对象->技能等级[当前职业对象->被动技能索引+索引]=Index;	//主动和被动放在一起，被动在后面
		}
		else if (SettingIndex==设置_职业Buff技能提升率)
		{
			当前角色对象->职业BUFF提升=Value;
		}
		else if (SettingIndex>=设置_护石1 && SettingIndex<=设置_护石3)
		{
			//旧索引被覆盖，没法恢复FALSE，全部重设
			for (int i=0;i<当前职业对象->主动技能数量;i++)
				当前角色对象->技能使用护石[i]=FALSE;
			for (int i=0;i<3;i++)
			{
				int 护石=GetIndexSetting(设置_护石1+i);
				int 技能索引=获取护石对应技能索引(护石);
				if (技能索引!=-1)
					当前角色对象->技能使用护石[技能索引]=TRUE;
			}
		}
		else if (SettingIndex>=设置_符文1 && SettingIndex<=设置_符文9颜色)
		{
			//旧索引被覆盖，没法减少，全部重设
			for (int i=0;i<当前职业对象->主动技能数量;i++)
			{
				当前角色对象->技能符文数量[i].红色数量=0;
				当前角色对象->技能符文数量[i].蓝色数量=0;
				当前角色对象->技能符文数量[i].紫色数量=0;
				当前角色对象->技能符文数量[i].绿色数量=0;
			}
			for (int i=0;i<9;i++)
			{
				int 符文=GetIndexSetting(设置_符文1+i);
				int 符文颜色=GetIndexSetting(设置_符文1颜色+i);
				int 技能索引=获取符文对应技能索引(符文);
				if (技能索引!=-1)
				{
					//忽略黄色
					if (符文颜色==0)
						当前角色对象->技能符文数量[技能索引].红色数量++;
					else if (符文颜色==1)
						当前角色对象->技能符文数量[技能索引].蓝色数量++;
					else if (符文颜色==2)
						当前角色对象->技能符文数量[技能索引].紫色数量++;
					else if (符文颜色==3)
						当前角色对象->技能符文数量[技能索引].绿色数量++;
				}	
			}		
		}
		else if (SettingIndex==设置_奶妈特殊设置1 || SettingIndex==设置_剑帝特殊设置1)
		{
			当前角色对象->职业特殊设置[0]=Index;
		}
		else if (SettingIndex==设置_奶妈特殊设置2 || SettingIndex==设置_剑帝特殊设置2)
		{
			当前角色对象->职业特殊设置[1]=Index;
		}
		else if (SettingIndex==设置_场景)
		{
			当前角色对象->场景=(DNF场景)Index;
		}
		else if (SettingIndex==设置_怪物)
		{
			当前角色对象->怪物=(DNF怪物)Index;
		}
		else if (SettingIndex>=设置_药剂1 && SettingIndex<=设置_药剂13)
		{
			int 索引=SettingIndex-设置_药剂1;
			当前角色对象->使用药剂[索引]=Index;
		}
		else if (SettingIndex>=设置_出血触发频率 && SettingIndex<=设置_感电触发频率)
		{
			int 序号=SettingIndex-设置_出血触发频率;
			float 时间=999;
			if (Index!=0)
				时间=3-(Index-1)*0.5f;
			if (序号==0)
				当前角色对象->出血触发频率间隔=时间;
			else if (序号==1)
				当前角色对象->中毒触发频率间隔=时间;
			else if (序号==2)
				当前角色对象->灼伤触发频率间隔=时间;
			else if (序号==3)
				当前角色对象->感电触发频率间隔=时间;
		}
		else if (SettingIndex>=设置_出血层数 && SettingIndex<=设置_感电层数)
		{
			int 序号=SettingIndex-设置_出血层数;
			//没有0层
			if (序号==0)
				当前角色对象->出血层数=Index+1;
			else if (序号==1)
				当前角色对象->中毒层数=Index+1;
			else if (序号==2)
				当前角色对象->感电层数=Index+1;
		}
		else if (SettingIndex==设置_控制型异常开关)
		{
			当前角色对象->适用控制型异常=Index;
		}
		else if (SettingIndex==设置_控制型异常触发频率)
		{
			float 时间=999;
			if (Index!=0)
				时间=3-(Index-1)*0.5f;
			当前角色对象->控制型异常触发频率间隔=时间;
		}
		else if (SettingIndex==设置_HP范围)
		{
			当前角色对象->HP范围=1.0f-Index*0.1f;
		}
		else if (SettingIndex==设置_MP范围)
		{
			当前角色对象->MP范围=1.0f-Index*0.1f;
		}
		else if (SettingIndex==设置_队员数量)
		{
			//没有0
			当前角色对象->队员数量=Index+1;
		}
		else if (SettingIndex==设置_怪物数量)
		{
			//没有0
			当前角色对象->怪物数量=Index+1;
		}
		else if (SettingIndex==设置_千发暴击类型)
		{
			当前角色对象->千发暴击类型=Index;
		}
		else if (SettingIndex==设置_装备暴击类型)
		{
			当前角色对象->装备暴击类型=Index;
		}
		else if (SettingIndex>=设置_机械怪物 && SettingIndex<=设置_昆虫怪物)
		{
			int 序号=SettingIndex-设置_机械怪物;
			当前角色对象->怪物种族标记[序号]=Index;
		}
		else if (SettingIndex>=设置_普通敌人 && SettingIndex<=设置_非破招攻击)
		{
			int 序号=SettingIndex-设置_普通敌人;
			当前角色对象->敌人状态标记[序号]=Index;
		}
		else if (SettingIndex>=设置_自身出血状态 && SettingIndex<=设置_自身束缚状态)
		{
			int 序号=SettingIndex-设置_自身出血状态;
			当前角色对象->自身异常状态标记[序号]=Index;
		}

		else if (SettingIndex>=设置_怪物出血状态 && SettingIndex<=设置_怪物束缚状态)
		{
			int 序号=SettingIndex-设置_怪物出血状态;
			当前角色对象->敌人异常状态标记[序号]=Index;
		}

		SetSettingChangeState(SettingIndex,0);
	}
}

